<?php
/**
 * Modelo CRUD de M para N. Insere registros distribuídos em uma tabela principal e uma tabela relacionada
 * @author Emanuel Melo e Renato Lenz @ PC4 Team
 * @example Inserir um pacote com serviços associados
 */
class PC4_Crud_M2N extends PC4_Crud_Upload2 {

	protected $tabelaRelacionada, $mRelacionado;
	protected $prefixo, $juncao;
	
	function __construct($tabela, $tabelaRelacionada, $caminho = '', $uploads = array(), $prefixo = 'id_', $juncao = '_rel_', $validacoes = array()) {
		parent::__construct($caminho, $tabela, $uploads, $validacoes);
		
		$this->tabelaRelacionada = $tabelaRelacionada;
		$this->prefixo = $prefixo;
		$this->juncao = $juncao;
		
		$this->mRelacionado = new PC4_Crud_Abstrato($this->tabela . $this->juncao . $this->tabelaRelacionada);
	}
	/**
	 * Recebe um array com os campos e insere na base de dados o novo registro
	 * @param array $umRegistro
	 * @return O id inserido ou um array com mensagens de erro
	 */
	function insere($registro) {
		$idsRelacionados = $registro[$this->tabelaRelacionada];
		unset($registro[$this->tabelaRelacionada]);
		
		$idRegistro = parent::insere($registro);
		if (is_numeric($idRegistro)) {
			$rsRelacionados = array();
			foreach ((array)$idsRelacionados as $id) {
				$rsRelacionados[] = array(
					$this->prefixo . $this->tabelaRelacionada => $id,
					$this->prefixo . $this->tabela => (!empty($idRegistro)) ? $idRegistro : $registro['id']
				);
//				$this->db->insert($this->tabela . $this->juncao . $this->tabelaRelacionada, $rRelacionado);
			}
			d($rsRelacionados); die;
			if(!empty($rsRelacionados)){			
				$this->mRelacionado->insereVarios($rsRelacionados, '');
			}
		}
		return $idRegistro;
		
	}
	/**
	 * 
	 * @param array $umRegistro
	 * @param int $id
	 * @return devolve um array de erros (nomeCampo/erro) para cada campo que não passou da validação 
	 */
	function edita($registro, $id) {
		$idsRelacionados = $registro[$this->tabelaRelacionada];
		unset($registro[$this->tabelaRelacionada]);
		
		$erros = parent::edita($registro, $id);
		
		if (empty($erros)) {
			$this->db->delete($this->tabela . $this->juncao . $this->tabelaRelacionada, array($this->prefixo . $this->tabela => $id));
			$rsRelacionados = array();
			foreach ((array)$idsRelacionados as $idRel) {
				$rsRelacionados[] = array(
					$this->prefixo . $this->tabelaRelacionada => $idRel,
					$this->prefixo . $this->tabela => $id
				);
//				$this->db->insert($this->tabela . $this->juncao . $this->tabelaRelacionada, $rRelacionado);
			}
			if(!empty($rsRelacionados)){
				$this->mRelacionado->insereVarios($rsRelacionados, '');
			}
		}
		return $erros;
	}
	/**
	 * Apaga um registro
	 * @param int $id
	 * @return int Linhas afetadas
	 */
	function apaga($id) {
		$this->db->delete($this->tabela . $this->juncao . $this->tabelaRelacionada, array($this->prefixo . $this->tabela => $id));
		return parent::apaga($id);
		
	}

	public function lista($pagina = 1, $limite = 30, $debug = false){
		$this->db->select($this->letra . '.*, GROUP_CONCAT(DISTINCT tb2.id) AS ' . $this->prefixo . $this->tabelaRelacionada);
		$this->db->join($this->tabela . $this->juncao . $this->tabelaRelacionada . ' tbR', $this->letra . '.id = tbR.' . $this->prefixo . $this->tabela, 'LEFT');
		$this->db->join($this->tabelaRelacionada . ' tb2', 'tb2.id = tbR.' . $this->prefixo . $this->tabelaRelacionada, 'LEFT');
		$this->db->group_by($this->letra . '.id');
		
		return parent::lista($pagina, $limite, $debug);
	}

}
?>